package ar.com.age.distribuidora.presentacion.controller;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import models.LineaFacturaAux;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import ar.com.age.distribuidora.dominio.Cliente;
import ar.com.age.distribuidora.dominio.LineaFactura;
import ar.com.age.distribuidora.dominio.Producto;
import ar.com.age.distribuidora.dominio.Vendedor;
import ar.com.age.distribuidora.presentacion.util.ServiceLocator;

@ManagedBean
@ViewScoped
public class FacturaVentaNewBean {

	private Cliente clienteSeleccionadoRegistrar;
	private List<Cliente> clientes;
	
	private Vendedor vendedorSeleccionadoRegistrar;
	private List<Vendedor> vendedores;
	
	private Date fechaRegistrar;
	
	private String unidadesRegistrar;
	
	private Producto productoSeleccionadoRegistrar;
	private List<Producto> productos;

	private String cantidadRegistrar;
	
	private String precioRegistrar;
	
	private List<LineaFactura> lineasRegistrar = new ArrayList<LineaFactura>();
	private LineaFactura lineaFactura;
	private List<LineaFacturaAux> lineasFacturaAux= new ArrayList<LineaFacturaAux>();
	private LineaFacturaAux linea;
	
	private Double total;

	public FacturaVentaNewBean() {
		clientes = ServiceLocator.getClienteService().buscarTodos();
		vendedores = ServiceLocator.getVendedorService().buscarTodos();
		productos= ServiceLocator.getProductoService().buscarTodos();
		lineasRegistrar = new ArrayList<LineaFactura>();
		total= new Double(0.00);
	}
	public String agregarLinea() {  

		linea= new LineaFacturaAux();
		linea.setCantidad(cantidadRegistrar);
		double p= Double.parseDouble(precioRegistrar);
		double c= Double.parseDouble(cantidadRegistrar);
		Double imp= truncate(c*p, 2) ;
		String impoString= imp.toString();
		linea.setImporte(impoString);
		total=total+imp;
		total= truncate(total, 2);
		linea.setPrecio(precioRegistrar);
		linea.setProducto(productoSeleccionadoRegistrar.getNombre());
		linea.setUnidades(unidadesRegistrar);
		lineasFacturaAux.add(linea);

		return null;
	}
	double truncate(double number, int precision)
	{
	    double prec = Math.pow(10, precision);
	    int integerPart = (int) number;
	    double fractionalPart = number - integerPart;
	    fractionalPart *= prec;
	    int fractPart = (int) fractionalPart;
	    fractionalPart = (double) (integerPart) + (double) (fractPart)/prec;
	    return fractionalPart;
	}
	public void exportarPDF() throws JRException, IOException{
		Map<String, Object> parametros = new HashMap<String, Object>();
		
		parametros.put("txtNombreCli", "Cliente: "+ clienteSeleccionadoRegistrar.getRazonSocial());	
		parametros.put("total",total);
		parametros.put("tipo", "Factura: A");
		parametros.put("cuit", "cuit :30-70815071-8");

		File jasper= new File(FacesContext.getCurrentInstance().getExternalContext().getRealPath("/jasper/facturaventa.jasper"));
		JasperPrint jasperPrint= JasperFillManager.fillReport(jasper.getPath(), parametros,new JRBeanCollectionDataSource(lineasFacturaAux));
		
		HttpServletResponse response= (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
		response.addHeader("Content-disposition","attachment; filename=facturaVenta.pdf");
		ServletOutputStream stream= response.getOutputStream();
		
		JasperExportManager.exportReportToPdfStream(jasperPrint, stream);
		stream.flush();
		stream.close();	
		FacesContext.getCurrentInstance().responseComplete();
	}
	public String registrarVenta() {
		return "registrarventa";
	}
	/**************************************************************/
	/*			             GET AND SET			              */
	/**************************************************************/
	public Cliente getClienteSeleccionadoRegistrar() {
		return clienteSeleccionadoRegistrar;
	}

	public void setClienteSeleccionadoRegistrar(Cliente clienteSeleccionadoRegistrar) {
		this.clienteSeleccionadoRegistrar = clienteSeleccionadoRegistrar;
	}

	public List<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}

	public Vendedor getVendedorSeleccionadoRegistrar() {
		return vendedorSeleccionadoRegistrar;
	}

	public void setVendedorSeleccionadoRegistrar(
			Vendedor vendedorSeleccionadoRegistrar) {
		this.vendedorSeleccionadoRegistrar = vendedorSeleccionadoRegistrar;
	}

	public List<Vendedor> getVendedores() {
		return vendedores;
	}

	public void setVendedores(List<Vendedor> vendedores) {
		this.vendedores = vendedores;
	}

	public Date getFechaRegistrar() {
		return fechaRegistrar;
	}

	public void setFechaRegistrar(Date fechaRegistrar) {
		this.fechaRegistrar = fechaRegistrar;
	}

	public String getUnidadesRegistrar() {
		return unidadesRegistrar;
	}

	public void setUnidadesRegistrar(String unidadesRegistrar) {
		this.unidadesRegistrar = unidadesRegistrar;
	}

	public Producto getProductoSeleccionadoRegistrar() {
		return productoSeleccionadoRegistrar;
	}

	public void setProductoSeleccionadoRegistrar(
			Producto productoSeleccionadoRegistrar) {
		this.productoSeleccionadoRegistrar = productoSeleccionadoRegistrar;
	}

	public List<Producto> getProductos() {
		return productos;
	}

	public void setProductos(List<Producto> productos) {
		this.productos = productos;
	}

	public String getCantidadRegistrar() {
		return cantidadRegistrar;
	}

	public void setCantidadRegistrar(String cantidadRegistrar) {
		this.cantidadRegistrar = cantidadRegistrar;
	}

	public String getPrecioRegistrar() {
		return precioRegistrar;
	}

	public void setPrecioRegistrar(String precioRegistrar) {
		this.precioRegistrar = precioRegistrar;
	}
	public List<LineaFactura> getLineasRegistrar() {
		return lineasRegistrar;
	}
	public void setLineasRegistrar(List<LineaFactura> lineasRegistrar) {
		this.lineasRegistrar = lineasRegistrar;
	}
	public LineaFactura getLineaFactura() {
		return lineaFactura;
	}
	public void setLineaFactura(LineaFactura lineaFactura) {
		this.lineaFactura = lineaFactura;
	}
	public LineaFacturaAux getLineaFacturaAux() {
		return linea;
	}
	public void setLineaFacturaAux(LineaFacturaAux lineaFacturaAux) {
		this.linea = lineaFacturaAux;
	}
	public List<LineaFacturaAux> getLineasFacturaAux() {
		return lineasFacturaAux;
	}
	public void setLineasFacturaAux(List<LineaFacturaAux> lineasFacturaAux) {
		this.lineasFacturaAux = lineasFacturaAux;
	}
	public LineaFacturaAux getLinea() {
		return linea;
	}
	public void setLinea(LineaFacturaAux linea) {
		this.linea = linea;
	}
	public Double getTotal() {
		return total;
	}
	public void setTotal(Double total) {
		this.total = total;
	}


}
